from django.contrib.sessions.models import Session
import django.utils.timezone as timezone
from logzero import logger
from django.db.models import Q

from .models import Teacher, Administrator, Student

class Iden:
    def __init__(self):
        self.iden = None              # 身份
        self.id = None                # id
        self.logined_user_id_list = []  # 记录已登录用户列表

    def iden_file(self):  # 判断用户是否存在
        sql = None
        try:
            if self.iden == 'teacher':
               sql = Teacher.objects.get(Account=self.id)
            elif self.iden == 'student':
                sql = Student.objects.get(Account=self.id)
            else:
                sql = Administrator.objects.get(Account=self.id)
            return sql
        except:
            return 203

    def match_pwd(self, pwd1, pwd2):  # 验证密码
        if pwd1 != pwd2:
            return False
        else:
            return True


    def one_point_login(self, request):
        '''
        单点登录
        若 用户 在不同客户端 或在 不同 浏览器 请求同一个 账号 登录时
        会 挤掉前一个用户
        使用的是django 自己的 session 组件  可自行 解析 session_key 中 包含的信息
        '''
        valid_session_obj_list = Session.objects.filter(expire_date__gt=timezone.now())
        for session_obj in valid_session_obj_list:  # 唯一登录
            user_id = Session.get_decoded(session_obj).get("account")  # 从sessionId中反解出account
            if user_id:
                self.logined_user_id_list.append(user_id)  # 获取所有在线列表
        length = len(self.logined_user_id_list)  # 第一个登录的用户
        if length == 0:
            self.logined_user_id_list.append(self.id)
        cookie = request.session.session_key  # cookie   因为  session_key 是存在  浏览器 的cookie 中 的

        if length >= 1 and self.id in self.logined_user_id_list:  # 重复登录
            logger.info("此账号已经登录")
            for session_obj in valid_session_obj_list:
                #    if request.session_key == session_obj:
                user_id = Session.get_decoded(session_obj).get("account")
                if self.id == user_id:
                    Session.objects.filter(
                        Q(session_key=session_obj) & ~Q(session_key=cookie)).delete()  # 清除前一个人的session除了当前浏览器的cookie
                    # return
            # request.session.flush()  #清除当前
            # res['status'] = 203
            # return JsonResponse(res)

